/**
 * JSparrow - Une version numérique du jeu "Attention Pirates !" - Copyright (C) 2014 Black Pearl
 *
 * This program is free software: you can redistribute it and/or modify it under the terms of the
 * GNU General Public License as published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with this program. If
 * not, see <http://www.gnu.org/licenses/>.
 */
package App.Vue;

import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.border.EmptyBorder;

import App.Controleur.Jeu;

@SuppressWarnings("serial")
public class Panneau_Actions extends JPanel_Principal{

	protected Jeu controleur;
	private String cibleAttaque;
	private String cibleDeplace;
	private JLabel lblTresors;
	private JLabel lblBateau;
	JButton deplacer;
	JButton attaquer;
	JButton reparer;
	//Utile pour l'image de fond
	private Image parchemin;
	private boolean flagInit = true;

	/**
	 * Créer un panneau action
	 * @param nbTresorPort
	 * @param nbTresorBateau
	 * @param nbCanons
	 * @param nbPirates
	 * @param attaquable Le joueur peut attaquer
	 * @param deplacable le joueur peut se déplacer
	 * @param reparable le joueur peut réparer son bateau
	 */
	public Panneau_Actions(Jeu controleur,int nbTresorPort, int nbTresorBateau, int nbCanons, int nbPirates, boolean attaquable,boolean deplacable,boolean reparable){

		this.controleur = controleur;
		//Rend transparent le fond du panel
		this.setBackground(TRANSPARENT);
		this.setOpaque(false);

		//Layout du panel
		this.setLayout(new GridBagLayout());
		this.setBorder(new EmptyBorder(20, 20, 20, 20) );
		//Initialisation des boutons
		deplacer = new JButton("Se déplacer");
		attaquer = new JButton("Attaquer");
		reparer = new JButton("Réparer");
		
		deplacer.addActionListener(new boutonListener("Deplacer"));
		attaquer.addActionListener(new boutonListener("Attaquer"));
		reparer.addActionListener(new boutonListener("Reparer"));
		//Rend accessible ou non les boutons
		attaquer.setEnabled(attaquable);
		deplacer.setEnabled(deplacable);
		reparer.setEnabled(reparable);

		//Initialisation des Labels à afficher
		lblTresors = new JLabel("<html>Information sur mon trésor :"+
				"<br>Trésors sur le bateau : " + nbTresorBateau  +
				"<br>Trésors au port : " + nbTresorPort+"<html>");
		lblBateau = new JLabel("<html>Information sur mon bateau :"+
				"<br>Nombre de pirates : " + nbPirates +
				"<br>Nombre de canons : " + nbCanons+"<html>");

		//Ajout des composant
		this.addItem(deplacer	, 0, 0, 1, 1, GridBagConstraints.WEST, 5, GridBagConstraints.BOTH);
		this.addItem(attaquer	, 0, 1, 1, 1, GridBagConstraints.WEST, 5, GridBagConstraints.BOTH);
		this.addItem(reparer	, 0, 2, 1, 1, GridBagConstraints.WEST, 5, GridBagConstraints.BOTH);
		/*this.addItem(lblTresors		, 1, 0, 1, 1, GridBagConstraints.NORTHWEST, 5, GridBagConstraints.VERTICAL);
		this.addItem(lblBateau	, 1, 1, 1, 1, GridBagConstraints.NORTHWEST, 5, GridBagConstraints.VERTICAL);
		*/
		//Reglage de la police
		lblTresors.setFont(texteFont);
		lblBateau.setFont(texteFont);
		attaquer.setFont(boutonFont);
		reparer.setFont(boutonFont);
		deplacer.setFont(boutonFont);
	}

	/**
	 * Met à jour les données du panneaux
	 * @param nbTresorPort
	 * @param nbTresorBateau
	 * @param nbCanons
	 * @param nbPirates
	 * @param attaquable Le joueur peut attaquer
	 * @param deplacable le joueur peut se déplacer
	 * @param reparable le joueur peut réparer son bateau
	 */
	public void updateActions(int nbTresorPort, int nbTresorBateau, int nbCanons, int nbPirates, boolean attaquable,boolean deplacable, boolean reparable){

		/*lblTresors.setText("<html>Information sur mon trésor :"+
				"<br>Trésors sur le bateau : " + nbTresorBateau  +
				"<br>Trésors au port : " + nbTresorPort+"<html>");
		lblBateau.setText("<html>Information sur mon bateau :"+
				"<br>Nombre de pirates : " + nbPirates +
				"<br>Nombre de canons : " + nbCanons+"<html>");
*/
		attaquer.setEnabled(attaquable);
		deplacer.setEnabled(deplacable);
		reparer.setEnabled(reparable);
	}

	/**
	 * Listener des boutons
	 */
	class boutonListener implements ActionListener{

		String bouton;
		public boutonListener(String bouton){
			super();
			this.bouton = bouton;
		}

		@Override
		public void actionPerformed(ActionEvent e) {
			//TODO : Notification au controleur
			switch (bouton) {
			case "Deplacer" :
				controleur.gestionEvenementVue("deplacer="+cibleDeplace);
				break;
			case "Attaquer":
				controleur.gestionEvenementVue("attaquer="+cibleAttaque);
				break;
			case "Reparer" :
				controleur.calculCredit();
				break;
			default :
			}
		}

	}
	
	/**
	 * Ajoute un composant à la gridBagLayout
	 * @param c Element à ajouter
	 * @param x colonne de la grille
	 * @param y ligne de la grille
	 * @param width nb de cases à prendre en largeur
	 * @param height nb de case en hauteur
	 * @param align ancre d'alignement
	 * @param leftPadding marge droite
	 * @param fill règle de remplissage
	 */
	private void addItem(JComponent c, int x, int y, int width, int height, int align, int leftPadding,int fill) {
		GridBagConstraints gc = new GridBagConstraints();
		gc.gridx = x;
		gc.gridy = y;
		gc.gridwidth = width;
		gc.gridheight = height;
		gc.weightx = 1;
		gc.weighty = 1;
		gc.insets = new Insets(5, leftPadding, 5, 0);
		gc.anchor = align;
		gc.fill = fill;
		this.add(c, gc);
	}

	/**
	 * Peint le background parchemin
	 */
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		if(flagInit){
			try {
				BufferedImage bufferedFond = ImageIO.read(this.getClass().getClassLoader().getResourceAsStream("img/parcheminH.png"));
				parchemin = bufferedFond.getScaledInstance(getWidth(),getHeight(), 0);

			} catch (IOException e) {
				e.printStackTrace();
			}
			flagInit = false;
		}
		g.drawImage(parchemin, 0, 0, this);
	}

	public void updateAttaquer(boolean attaquable, String position){
		cibleAttaque = position;
		attaquer.setEnabled(attaquable);
	}
	
	public void updateDeplacer(boolean deplacable, String position){
		cibleDeplace = position;
		deplacer.setEnabled(deplacable);
	}
	
	public void updateReparer(boolean reparable){
		reparer.setEnabled(reparable);
	}
}
